﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace BlogApp.WP8.Utils
{
    public static class ExtensionMethods
    {
        public static string HtmlDecode(this string text)
        {
            var specialCaracterDict = new Dictionary<string, string> { { "&Aacute;", "Á" }, { "&aacute;", "á" }, { "&Acirc;", "Â" }, { "&acirc;", "â" }, { "&acute;", "´" }, { "&AElig;", "Æ" }, { "&aelig;", "æ" }, { "&Agrave;", "À" }, { "&agrave;", "à" }, { "&alefsym;", "?" }, { "&Alpha;", "?" }, { "&alpha;", "a" }, { "&amp;", "&" }, { "&and;", "?" }, { "&ang;", "?" }, { "&apos;", "'" }, { "&Aring;", "Å" }, { "&aring;", "å" }, { "&asymp;", "˜" }, { "&Atilde;", "Ã" }, { "&atilde;", "ã" }, { "&Auml;", "Ä" }, { "&auml;", "ä" }, { "&bdquo;", "„" }, { "&Beta;", "?" }, { "&beta;", "ß" }, { "&brvbar;", "¦" }, { "&bull;", "•" }, { "&cap;", "n" }, { "&Ccedil;", "Ç" }, { "&ccedil;", "ç" }, { "&cedil;", "¸" }, { "&cent;", "¢" }, { "&Chi;", "?" }, { "&chi;", "?" }, { "&circ;", "ˆ" }, { "&clubs;", "?" }, { "&cong;", "?" }, { "&copy;", "©" }, { "&crarr;", "?" }, { "&cup;", "?" }, { "&curren;", "¤" }, { "&dagger;", "†" }, { "&Dagger;", "‡" }, { "&darr;", "?" }, { "&dArr;", "?" }, { "&deg;", "°" }, { "&Delta;", "?" }, { "&delta;", "d" }, { "&diams;", "?" }, { "&divide;", "÷" }, { "&Eacute;", "É" }, { "&eacute;", "é" }, { "&Ecirc;", "Ê" }, { "&ecirc;", "ê" }, { "&Egrave;", "È" }, { "&egrave;", "è" }, { "&empty;", "Ø" }, { "&emsp;", " " }, { "&ensp;", " " }, { "&Epsilon;", "?" }, { "&epsilon;", "e" }, { "&equiv;", "=" }, { "&Eta;", "?" }, { "&eta;", "?" }, { "&ETH;", "Ð" }, { "&eth;", "ð" }, { "&Euml;", "Ë" }, { "&euml;", "ë" }, { "&euro;", "€" }, { "&exist;", "?" }, { "&fnof;", "ƒ" }, { "&forall;", "?" }, { "&frac12;", "½" }, { "&frac14;", "¼" }, { "&frac34;", "¾" }, { "&frasl;", "/" }, { "&Gamma;", "G" }, { "&gamma;", "?" }, { "&ge;", "=" }, { "&gt;", ">" }, { "&harr;", "?" }, { "&hArr;", "?" }, { "&hearts;", "?" }, { "&hellip;", "…" }, { "&Iacute;", "Í" }, { "&iacute;", "í" }, { "&Icirc;", "Î" }, { "&icirc;", "î" }, { "&iexcl;", "¡" }, { "&Igrave;", "Ì" }, { "&igrave;", "ì" }, { "&image;", "I" }, { "&infin;", "8" }, { "&int;", "?" }, { "&Iota;", "?" }, { "&iota;", "?" }, { "&iquest;", "¿" }, { "&isin;", "?" }, { "&Iuml;", "Ï" }, { "&iuml;", "ï" }, { "&Kappa;", "?" }, { "&kappa;", "?" }, { "&Lambda;", "?" }, { "&lambda;", "?" }, { "&lang;", "<" }, { "&laquo;", "«" }, { "&larr;", "?" }, { "&lArr;", "?" }, { "&lceil;", "?" }, { "&ldquo;", "“" }, { "&le;", "=" }, { "&lfloor;", "?" }, { "&lowast;", "*" }, { "&loz;", "?" }, { "&lsaquo;", "‹" }, { "&lsquo;", "‘" }, { "&lt;", "<" }, { "&macr;", "¯" }, { "&mdash;", "—" }, { "&micro;", "µ" }, { "&middot;", "·" }, { "&minus;", "-" }, { "&Mu;", "?" }, { "&mu;", "µ" }, { "&nabla;", "?" }, { "&nbsp;", "" }, { "&ndash;", "–" }, { "&ne;", "?" }, { "&ni;", "?" }, { "&not;", "¬" }, { "&notin;", "?" }, { "&nsub;", "?" }, { "&Ntilde;", "Ñ" }, { "&ntilde;", "ñ" }, { "&Nu;", "?" }, { "&nu;", "?" }, { "&Oacute;", "Ó" }, { "&oacute;", "ó" }, { "&Ocirc;", "Ô" }, { "&ocirc;", "ô" }, { "&OElig;", "Œ" }, { "&oelig;", "œ" }, { "&Ograve;", "Ò" }, { "&ograve;", "ò" }, { "&oline;", "?" }, { "&Omega;", "O" }, { "&omega;", "?" }, { "&Omicron;", "?" }, { "&omicron;", "?" }, { "&oplus;", "?" }, { "&or;", "?" }, { "&ordf;", "ª" }, { "&ordm;", "º" }, { "&Oslash;", "Ø" }, { "&oslash;", "ø" }, { "&Otilde;", "Õ" }, { "&otilde;", "õ" }, { "&otimes;", "?" }, { "&Ouml;", "Ö" }, { "&ouml;", "ö" }, { "&para;", "¶" }, { "&part;", "?" }, { "&permil;", "‰" }, { "&perp;", "?" }, { "&Phi;", "F" }, { "&phi;", "f" }, { "&Pi;", "?" }, { "&pi;", "p" }, { "&piv;", "?" }, { "&plusmn;", "±" }, { "&pound;", "£" }, { "&prime;", "'" }, { "&Prime;", "?" }, { "&prod;", "?" }, { "&prop;", "?" }, { "&Psi;", "?" }, { "&psi;", "?" }, { "&quot;", "\\" }, { "&radic;", "v" }, { "&rang;", ">" }, { "&raquo;", "»" }, { "&rarr;", "?" }, { "&rArr;", "?" }, { "&rceil;", "?" }, { "&rdquo;", "”" }, { "&real;", "R" }, { "&reg;", "®" }, { "&rfloor;", "?" }, { "&Rho;", "?" }, { "&rho;", "?" }, { "&rsaquo;", "›" }, { "&rsquo;", "’" }, { "&sbquo;", "‚" }, { "&Scaron;", "Š" }, { "&scaron;", "š" }, { "&sdot;", "·" }, { "&sect;", "§" }, { "&Sigma;", "S" }, { "&sigma;", "s" }, { "&sigmaf;", "?" }, { "&sim;", "~" }, { "&spades;", "?" }, { "&sub;", "?" }, { "&sube;", "?" }, { "&sum;", "?" }, { "&sup;", "?" }, { "&sup1;", "¹" }, { "&sup2;", "²" }, { "&sup3;", "³" }, { "&supe;", "?" }, { "&szlig;", "ß" }, { "&Tau;", "?" }, { "&tau;", "t" }, { "&there4;", "?" }, { "&Theta;", "T" }, { "&theta;", "?" }, { "&thetasym;", "?" }, { "&thinsp;", "?" }, { "&THORN;", "Þ" }, { "&thorn;", "þ" }, { "&tilde;", "˜" }, { "&times;", "×" }, { "&trade;", "™" }, { "&Uacute;", "Ú" }, { "&uacute;", "ú" }, { "&uarr;", "?" }, { "&uArr;", "?" }, { "&Ucirc;", "Û" }, { "&ucirc;", "û" }, { "&Ugrave;", "Ù" }, { "&ugrave;", "ù" }, { "&uml;", "¨" }, { "&upsih;", "?" }, { "&Upsilon;", "?" }, { "&upsilon;", "?" }, { "&Uuml;", "Ü" }, { "&uuml;", "ü" }, { "&weierp;", "P" }, { "&Xi;", "?" }, { "&xi;", "?" }, { "&Yacute;", "Ý" }, { "&yacute;", "ý" }, { "&yen;", "¥" }, { "&yuml;", "ÿ" }, { "&Yuml;", "Ÿ" }, { "&Zeta;", "?" }, { "&zeta;", "?" }, { "&#193;", "Á" }, { "&#225;", "á" }, { "&#194;", "Â" }, { "&#226;", "â" }, { "&#180;", "´" }, { "&#198;", "Æ" }, { "&#230;", "æ" }, { "&#192;", "À" }, { "&#224;", "à" }, { "&#8501;", "?" }, { "&#913;", "?" }, { "&#945;", "a" }, { "&#38;", "&" }, { "&#038;", "&" }, { "&#8743;", "?" }, { "&#8736;", "?" }, { "&#39;", "'" }, { "&#039;", "'" }, { "&#197;", "Å" }, { "&#229;", "å" }, { "&#8776;", "˜" }, { "&#195;", "Ã" }, { "&#227;", "ã" }, { "&#196;", "Ä" }, { "&#228;", "ä" }, { "&#8222;", "„" }, { "&#914;", "?" }, { "&#946;", "ß" }, { "&#166;", "¦" }, { "&#8226;", "•" }, { "&#8745;", "n" }, { "&#199;", "Ç" }, { "&#231;", "ç" }, { "&#184;", "¸" }, { "&#162;", "¢" }, { "&#935;", "?" }, { "&#967;", "?" }, { "&#710;", "ˆ" }, { "&#9827;", "?" }, { "&#8773;", "?" }, { "&#169;", "©" }, { "&#8629;", "?" }, { "&#8746;", "?" }, { "&#164;", "¤" }, { "&#8224;", "†" }, { "&#8225;", "‡" }, { "&#8595;", "?" }, { "&#8659;", "?" }, { "&#176;", "°" }, { "&#916;", "?" }, { "&#948;", "d" }, { "&#9830;", "?" }, { "&#247;", "÷" }, { "&#201;", "É" }, { "&#233;", "é" }, { "&#202;", "Ê" }, { "&#234;", "ê" }, { "&#200;", "È" }, { "&#232;", "è" }, { "&#8709;", "Ø" }, { "&#8195;", " " }, { "&#8194;", " " }, { "&#917;", "?" }, { "&#949;", "e" }, { "&#8801;", "=" }, { "&#919;", "?" }, { "&#951;", "?" }, { "&#208;", "Ð" }, { "&#240;", "ð" }, { "&#203;", "Ë" }, { "&#235;", "ë" }, { "&#8364;", "€" }, { "&#8707;", "?" }, { "&#402;", "ƒ" }, { "&#8704;", "?" }, { "&#189;", "½" }, { "&#188;", "¼" }, { "&#190;", "¾" }, { "&#8260;", "/" }, { "&#915;", "G" }, { "&#947;", "?" }, { "&#8805;", "=" }, { "&#62;", ">" }, { "&#062;", ">" }, { "&#8596;", "?" }, { "&#8660;", "?" }, { "&#9829;", "?" }, { "&#8230;", "…" }, { "&#205;", "Í" }, { "&#237;", "í" }, { "&#206;", "Î" }, { "&#238;", "î" }, { "&#161;", "¡" }, { "&#204;", "Ì" }, { "&#236;", "ì" }, { "&#8465;", "I" }, { "&#8734;", "8" }, { "&#8747;", "?" }, { "&#921;", "?" }, { "&#953;", "?" }, { "&#191;", "¿" }, { "&#8712;", "?" }, { "&#207;", "Ï" }, { "&#239;", "ï" }, { "&#922;", "?" }, { "&#954;", "?" }, { "&#923;", "?" }, { "&#955;", "?" }, { "&#9001;", "<" }, { "&#171;", "«" }, { "&#8592;", "?" }, { "&#8656;", "?" }, { "&#8968;", "?" }, { "&#8220;", "“" }, { "&#8804;", "=" }, { "&#8970;", "?" }, { "&#8727;", "*" }, { "&#9674;", "?" }, { "&#8249;", "‹" }, { "&#8216;", "‘" }, { "&#60;", "<" }, { "&#060;", "<" }, { "&#175;", "¯" }, { "&#8212;", "—" }, { "&#181;", "µ" }, { "&#183;", "·" }, { "&#8722;", "-" }, { "&#924;", "?" }, { "&#956;", "µ" }, { "&#8711;", "?" }, { "&#160;", "" }, { "&#8211;", "–" }, { "&#8800;", "?" }, { "&#8715;", "?" }, { "&#172;", "¬" }, { "&#8713;", "?" }, { "&#8836;", "?" }, { "&#209;", "Ñ" }, { "&#241;", "ñ" }, { "&#925;", "?" }, { "&#957;", "?" }, { "&#211;", "Ó" }, { "&#243;", "ó" }, { "&#212;", "Ô" }, { "&#244;", "ô" }, { "&#338;", "Œ" }, { "&#339;", "œ" }, { "&#210;", "Ò" }, { "&#242;", "ò" }, { "&#8254;", "?" }, { "&#937;", "O" }, { "&#969;", "?" }, { "&#927;", "?" }, { "&#959;", "?" }, { "&#8853;", "?" }, { "&#8744;", "?" }, { "&#170;", "ª" }, { "&#186;", "º" }, { "&#216;", "Ø" }, { "&#248;", "ø" }, { "&#213;", "Õ" }, { "&#245;", "õ" }, { "&#8855;", "?" }, { "&#214;", "Ö" }, { "&#246;", "ö" }, { "&#182;", "¶" }, { "&#8706;", "?" }, { "&#8240;", "‰" }, { "&#8869;", "?" }, { "&#934;", "F" }, { "&#966;", "f" }, { "&#928;", "?" }, { "&#960;", "p" }, { "&#982;", "?" }, { "&#177;", "±" }, { "&#163;", "£" }, { "&#8242;", "'" }, { "&#8243;", "?" }, { "&#8719;", "?" }, { "&#8733;", "?" }, { "&#936;", "?" }, { "&#968;", "?" }, { "&#34;", "\\" }, { "&#034;", "\\" }, { "&#8730;", "v" }, { "&#9002;", ">" }, { "&#187;", "»" }, { "&#8594;", "?" }, { "&#8658;", "?" }, { "&#8969;", "?" }, { "&#8221;", "”" }, { "&#8476;", "R" }, { "&#174;", "®" }, { "&#8971;", "?" }, { "&#929;", "?" }, { "&#961;", "?" }, { "&#8250;", "›" }, { "&#8217;", "’" }, { "&#8218;", "‚" }, { "&#352;", "Š" }, { "&#353;", "š" }, { "&#8901;", "·" }, { "&#167;", "§" }, { "&#931;", "S" }, { "&#963;", "s" }, { "&#962;", "?" }, { "&#8764;", "~" }, { "&#9824;", "?" }, { "&#8834;", "?" }, { "&#8838;", "?" }, { "&#8721;", "?" }, { "&#8835;", "?" }, { "&#185;", "¹" }, { "&#178;", "²" }, { "&#179;", "³" }, { "&#8839;", "?" }, { "&#223;", "ß" }, { "&#932;", "?" }, { "&#964;", "t" }, { "&#8756;", "?" }, { "&#920;", "T" }, { "&#952;", "?" }, { "&#977;", "?" }, { "&#8201;", "?" }, { "&#222;", "Þ" }, { "&#254;", "þ" }, { "&#732;", "˜" }, { "&#215;", "×" }, { "&#8482;", "™" }, { "&#218;", "Ú" }, { "&#250;", "ú" }, { "&#8593;", "?" }, { "&#8657;", "?" }, { "&#219;", "Û" }, { "&#251;", "û" }, { "&#217;", "Ù" }, { "&#249;", "ù" }, { "&#168;", "¨" }, { "&#978;", "?" }, { "&#933;", "?" }, { "&#965;", "?" }, { "&#220;", "Ü" }, { "&#252;", "ü" }, { "&#8472;", "P" }, { "&#926;", "?" }, { "&#958;", "?" }, { "&#221;", "Ý" }, { "&#253;", "ý" }, { "&#165;", "¥" }, { "&#255;", "ÿ" }, { "&#376;", "Ÿ" }, { "&#918;", "?" }, { "&#950;", "?" }, { "<p>", "" }, { "</p>", "" }, { "<a>", "" }, { "</a>", "" }, { "<a href=\"", "" }, { "/>", "" }, { "\"/>", "" } };
            text = specialCaracterDict.Aggregate(text, (current, kv) => current.Replace(kv.Key, kv.Value));
            //text = HttpUtility.HtmlDecode(text);

            return text;
        }


        public static void AddRange<T>(this IList<T> list, IEnumerable<T> collection)
        {
            foreach (var item in collection)
            {
                list.Add(item);
            }
        }


        public static void CreateOrUpdateElement<TKey, TValue>(this IDictionary<TKey, TValue> map, TKey key, TValue value)
        {
            if (map.ContainsKey(key))
            {
                map[key] = value;
            }
            else
            {
                map.Add(key, value);
            }
        }

        public static IEnumerable<TSource> DistinctBy<TSource, TKey>
            (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            HashSet<TKey> knownKeys = new HashSet<TKey>();
            foreach (TSource element in source)
            {
                if (knownKeys.Add(keySelector(element)))
                {
                    yield return element;
                }
            }
        }

        public static bool IsNoValidMailAdress(this string input)
        {
            var regex = new Regex(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
            return !regex.IsMatch(input);
        }
    }
}